#include <typescommon.h>
// 数组指针，指针数组
// 数组指针：(保存)数组(的)指针
// 指针数组：(保存)指针(的)数组


#define testLength 4
#define testColumnSize 2
int main(int argc, char **argv)
{
    {
        // 参考图片pointor-array.png
        int a[testLength] = {1, 2, 3, 4};
        int *pb[testLength];//指针数组
        int **pp = pb;//二级指针
        for (int i = 0 ; i < testLength; i++)
        {
            pb[i] = a + i;
            // pb[i] = &a[i]
        }
        for (int i = 0 ; i < testLength; i++)
        {
            logdebug("%d,%d", *pb[i], pp[i][0]);
        }
    }

    {
        // 指针数组分配每一个指针的空间。
        int *pb[testLength];//指针数组
        int **pp = pb;//二级指针
        for (int i = 0 ; i < testLength; i++)
        {
            pb[i] = malloc(sizeof(int));//手动分配每个指针的数据空间。
            *pb[i] = 100 + i;
            logdebug("%d,%d", *pb[i], pp[i][0]);
        }
        for (int i = 0 ; i < testLength; i++)
        {
            free(pb[i]);//需要释放
        }
    }

    {
        // 二级指针需要先分配指针数组的长度，然后再分为每个元素指针的空间
        int **pp;//二级指针
        pp = malloc(sizeof(int *) * testLength);
        for (int i = 0 ; i < testLength; i++)
        {
            pp[i] = malloc(sizeof(int));//手动分配每个指针的数据空间。
            *pp[i] = 200 + i;
            logdebug("%d,%d", *pp[i], pp[i][0]);
        }
        for (int i = 0 ; i < testLength; i++)
        {
            free(pp[i]);//需要释放每个元素指针的空间
        }
        free(pp);//释放数组空间。
    }

    {
        // 这里定义了b2[4][2]二位数组;参考图片array-pointor.png
        // 二维数组和一维数组类似，数组名b2是常量，他的地址&b2和他的值b2一样。他是连续分配的空间。
        // 我们可以把他理解成他是一维数组，b2[4],每个元素是一个数组，数组长度是2.
        // 所以b2[0]是一个数组的地址，他和b2+0效果一致，他们都可以表示访问第0行数组，第一行数据长度为2。
        // b2[0]虽然和b2的值一样，但是b2[0]表示第0行数组，b2表示二维数组。
        // 所以b2[1]是一个数组的地址，他和b2+1效果一致，他们都可以表示访问第1行数组，第二行数据长度为2。
        char b2[testLength][testColumnSize];//二位数组
        logdebug("2 array, &b2=%p, b2=%p, b2+1=%p", &b2, b2, b2 + 1);
        char (*bp)[testColumnSize] = b2;//数组指针
        logdebug("array pointor, &bp=%p, bp=%p, bp+1=%p", &bp, bp, bp + 1);
        for (int i = 0 ; i < testLength; i++)
        {
            for (int j = 0 ; j < testColumnSize; j++)
            {
                b2[i][j] = i * testColumnSize + j + 10;
            }
        }
        logdebug("print array");
        for (int i = 0 ; i < testLength; i++)
        {
            for (int j = 0 ; j < testColumnSize; j++)
            {
                printf("%03d ", bp[i][j]);
            }
            printf("\n");
        }
    }
    return 1;
}

